package de.tmahr.android;

import java.util.ArrayList;
import java.util.Random;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Bundle;
import android.view.View;

/**
 * Diese Klasse simuliert bewegte Kreise und zeichnet diese mittels Canvas-Technik auf den Bildschirm.
 * Die Simulation findet innerhalb des UI-Threads statt. 
 */
public class SimpleGraphicsTest extends Activity
{
	private Random rand = new Random();

	/**
	 * Definiert die für die Animation verwendeten Kreise.  
	 */
	class Kreis
	{
		float x, y, vx, vy;
		float radius; 
		int xMax, yMax;
		int r,g,b,a; // Farben: rot, grün, blau, alpha
		
		Kreis(int xMax, int yMax)
		{
			this.xMax = xMax;
			this.yMax = yMax;
			x = xMax*rand.nextFloat();
			y = yMax*rand.nextFloat();
			
			radius = 10*(0.1f+rand.nextFloat());
			
			float vMax = 10;
			vx = vMax*rand.nextFloat();
			vy = vMax*rand.nextFloat();
			
			r = rand.nextInt(256);
			g = rand.nextInt(256);
			b = rand.nextInt(256);
			a = rand.nextInt(256);
		}
		
		void bewege()
		{
			x += vx;
			if(x<0 || x>=xMax) { vx = -vx; }
			y += vy;
			if(y<0 || y>=yMax) { vy = -vy; }
		}
	}
	
	/**
	 * Diese spezialisierte View bewegt die Kreise und stellt sie auf dem Bildschirm dar.
	 */
	class RenderView extends View
	{
		private Paint paint; // enthält Zeichen-Attribute
		ArrayList<Kreis> kreise = null;
		
		public RenderView(Context c)
		{
			super(c);
			paint = new Paint();
			paint.setAntiAlias(true);
		}
		
		/**
		 * Diese Funktion wird aufgerufen, wenn die View neu gezeichnet werden muss.  
		 */
		protected void onDraw(Canvas canvas)
		{
			naechsterSchritt(canvas);
			invalidate(); // veranlasst das Neuzeichnen der View
		}
		
		private void naechsterSchritt(Canvas canvas)
		{
			if(kreise==null)
			{
				kreise = new ArrayList<Kreis>();
				for(int i=0; i<100; i++)
				{
					kreise.add(new Kreis(canvas.getWidth(),canvas.getHeight()));
				}
			}

			paint.setStyle(Style.FILL);
			for(Kreis p : kreise)
			{
				paint.setARGB(p.a,p.r,p.g,p.b);
				canvas.drawCircle(p.x,p.y,p.radius,paint);
				p.bewege();
			}
		}
	}
	
	@Override
	public void onCreate(Bundle b)
	{
		super.onCreate(b);
		setTitle(SimpleGraphicsTest.class.getSimpleName());
		setContentView(new RenderView(this));
	}
}
